home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 201-225 / disk_217 / sonixpeek / src / tiny.a < prev    next >
Text File  |  1992-05-06  |  10KB  |  269 lines

  1. *:ts=8
  2. ****************************************************************************
  3. *                                                                          *
  4. * TINY.A                                  (C) Copyright Eddy Carroll 1989  *
  5. * ~~~~~~                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  *
  6. *                                                                          *
  7. * This is a rewrite of the startup code provided with Lattice C V4.0.      *
  8. * It is a "bare bones" version, which is substantially smaller, and also   *
  9. * allows programs to be linked without needing to access lc.lib (unless    *
  10. * of course they are using functions in lc.lib). Only CLI programs are     *
  11. * supported, and no default i/o channels or other lattice-specific stuff   *
  12. * are initialised. exit() doesn't automatically clean up any more, so      *
  13. * don't use things like malloc() and fopen() unless you call free() and    *
  14. * fclose() yourself. This replacement is designed for programs that go     *
  15. * directly to AmigaDOS and Exec, rather than through the Unix-like Lattice *
  16. * functions.                                                               *
  17. *                                                                          *
  18. * All in all, this version shaves around 1500 bytes off the size of a C    *
  19. * program. No guarantees are supplied as regards its suitability for any   *
  20. * particular use, other than it works for me.                              *
  21. *                                                                          *
  22. * Using it is very simple: Simply modify the command line for BLINK from   *
  23. * BLINK FROM LIB:C.O+.... to BLINK FROM TINY.O+... and leave everything    *
  24. * else the same.                                                           *
  25. *                                                                          *
  26. * Note that when assembling this, make sure to specify the -u switch on    *
  27. * the Lattice assembler's command line. This adds a '_' to all symbols     *
  28. * defined. If you are using a different assembler, you need to add a '_'   *
  29. * manually yourself.                                                       *
  30. *                                                                          *
  31. ****************************************************************************
  32.  
  33.         INCLUDE "exec/types.i"
  34.         INCLUDE "exec/alerts.i"
  35.         INCLUDE "exec/nodes.i"
  36.         INCLUDE "exec/lists.i"
  37.         INCLUDE "exec/ports.i"
  38.         INCLUDE "exec/libraries.i"
  39.         INCLUDE "exec/tasks.i"
  40.         INCLUDE "libraries/dos.i"
  41.         INCLUDE "libraries/dosextens.i"
  42.         INCLUDE "workbench/startup.i"
  43.         INCLUDE "exec/funcdef.i"
  44.         INCLUDE "exec/exec_lib.i"
  45.         INCLUDE "libraries/dos_lib.i"
  46.  
  47. MAXARGS        EQU 32    ; Maximum number of command line arguments from CLI
  48. AbsExecBase EQU 4    ; Welcome to the only fixed point in the universe
  49.  
  50. * A useful macro to let us call library routines
  51. callsys macro
  52.         CALLLIB _LVO\1
  53.         endm
  54.         
  55.         xdef    XCEXIT            * exit(code) is standard way to exit C.
  56.     xdef    exit                    *
  57.  
  58.         xref    LinkerDB            * linker defined base value
  59.         xref    _BSSBAS            * linker defined base of BSS
  60.         xref    _BSSLEN            * linker defined length of BSS
  61.  
  62. *       library references
  63.  
  64.         csect   text,0,0,1,2        * xref's after this are 16-bit reloc
  65.  
  66.         xref    main            * Name of C program to start with.
  67.  
  68. start:
  69.         movem.l d1-d6/a0-a6,-(a7)
  70. REGSIZE EQU     (6+7)*4
  71.         lea     REGSIZE(a7),A5         * Determine old stack pointer
  72.         move.l  a0,a2                  * Save command pointer
  73.         move.l  d0,d2                  * and command length
  74.         lea     LinkerDB,a4            * Load base register
  75.  
  76.         move.l  AbsExecBase.W,a6
  77.         move.l  a6,SysBase(A4)
  78.         move.l  a7,_StackPtr(A4)       * Save stack ptr
  79.  
  80.     suba.l    a1,a1
  81.     callsys    FindTask           * Find out our task ID
  82.     move.l    d0,a3
  83.  
  84. *=======================================================================
  85. *====== CLI Startup Code ===============================================
  86. *=======================================================================
  87. *
  88. * Entry: D2 = command length
  89. *        A2 = Command pointer
  90. fromCLI:
  91.         move.l  a5,D0           * get top of stack
  92.         sub.l   4(a5),D0        * compute bottom 
  93.         add.l   #128,D0         * allow for parms overflow
  94.         move.l  D0,_base(A4)    * save for stack checking
  95. *-----------------------------------------------------------------------
  96. *  Open the DOS library:
  97.  
  98. openDOS
  99.     lea     DOSName(A4),A1
  100.     moveq.l #0,D0
  101.     callsys OpenLibrary
  102.     move.l  D0,DOSBase(A4)
  103.     bne    getcom
  104. noDOS:
  105.     moveq.l #100,d0
  106.     bra     exit2
  107.  
  108. *------ find command name:
  109. getcom:
  110.     move.l  pr_CLI(a3),a0
  111.         add.l   a0,a0           * bcpl pointer conversion
  112.         add.l   a0,a0
  113.         move.l  cli_CommandName(a0),a1
  114.         add.l   a1,a1           * bcpl pointer conversion
  115.         add.l   a1,a1
  116.  
  117. *------ collect parameters:
  118.         move.l  d2,d0                   * get command line length
  119.         moveq.l #0,d1
  120.         move.b  (a1)+,d1
  121.         move.l  a1,_ProgramName(A4)
  122.         add.l   d1,d0                   * add length of command name
  123.         addq.l  #1,d0                   * allow for space after command 
  124.  
  125.         clr.w   -(A7)                   * set null terminator for command line
  126.         addq.l  #1,D0                   * force to even number of bytes
  127.         andi.w  #$fffe,D0               * (round up)
  128.         sub.l   D0,A7                   * make room on stack for command line
  129.         subq.l  #2,D0
  130.         clr.w   0(A7,D0)
  131.  
  132. *------ copy command line onto stack
  133.         move.l  d2,d0                   * get command line length
  134.         subq.l  #1,d0
  135.         add.l   d1,d2
  136.  
  137. copy_line:
  138.         move.b  0(A2,D0.W),0(A7,D2.W)   * copy command line to stack
  139.         subq.l  #1,d2
  140.         dbf     d0,copy_line
  141.         move.b  #' ',0(a7,d2.w)         * add space between command and parms
  142.         subq.l  #1,d2
  143.  
  144. copy_cmd:
  145.         move.b  0(a1,d2.w),0(a7,d2.w)    * copy command name to stack
  146.         dbf     d2,copy_cmd
  147.     move.l    a7,a1            * Get pointer to new command line
  148.  
  149.     sub.l    #(MAXARGS*4),a7        * Reserve space for argv[]
  150.     move.l    a7,a2            * Initialise base into array
  151.     move.l    a2,a3            * Save base of argv
  152.     moveq    #0,d2            * Initialise argc
  153.  
  154. *
  155. * From here on down, A1 is pointer into command line
  156. *
  157. build_argv:
  158.     bsr.s    getnext            * Read next character from line
  159.     bcs.s    doquote            * If quote, handle
  160.     beq.s    build_argv        * If white space, skip over it
  161.  
  162.     lea    -1(a1),a0        * Get address of this parameter
  163.     bsr.s    bumpargv        * Store it to argv[] array
  164. build_2:
  165.     bsr.s    getnext            * Get next character
  166.     bne.s    build_2            * If not white space, keep looking
  167.     clr.b    -1(a1)            * Zero-terminate current argument
  168.     bra.s    build_argv        * And go back to get next argument
  169.  
  170. doquote:
  171.     move.l    a1,a0            * Get pointer to this argument
  172.     bsr.s    bumpargv        * Output it to argv[]
  173. quote_2:
  174.     bsr.s    getnext            * Get next character
  175.     bcc.s    quote_2            * If not quote, keep looking
  176.     clr.b    -1(a1)            * Zero-terminate current argument
  177. quote_3:
  178.     bsr.s    getnext            * Get next character
  179.     bne.s    quote_3            * Skip until space reached
  180.     beq.s    build_argv        * Go back and read next argument
  181.  
  182. bumpargv:
  183.     move.l    a0,(a2)+        * Output ptr to current argument
  184.     addq    #1,d2            * Increment argc
  185.     cmpi    #MAXARGS,d2        * Used up all our arguments yet?
  186.     bls.s    qrts            * If not, then return
  187.     moveq    #110,d0            * Else set return code
  188.     bra.s    exit2            * And exit
  189.  
  190. *
  191. * Reads next character from command line. If zero, never returns, but
  192. * drops into call to main. Else, returns, with C=1 if character is quote,
  193. * Z=1 if character is white space.
  194. *
  195. getnext:
  196.     move.b    (a1)+,d0        * Get character from command line
  197.     beq.s    get_2            * Exit if end of line
  198.     cmp.b    #34,d0            * Check if quote
  199.     beq.s    isquote            * 
  200.     cmp.b    #32,d0            * Check if space
  201.     beq.s    isspace            *
  202.     cmp.b    #9,d0            * Or tab
  203.     beq.s    isspace            *
  204.     cmp.b    #10,d0            * Or end of line
  205. isspace:
  206.     andi    #$1E,ccr        * Clear carry flag, retaining Z
  207. qrts    rts
  208.  
  209. isquote:
  210.     ori    #1,ccr            * Set carry flag
  211.     andi    #$FB,ccr        * Clear zero flag
  212.     rts                * And return
  213.  
  214. get_2:
  215.     move.l    a3,-(a7)        * Push argv onto stack
  216.     move.l    d2,-(a7)        * Push argc onto stack
  217.  
  218.         lea     _BSSBAS,a3          * get base of BSS
  219.         moveq   #0,d1
  220.         move.l  #_BSSLEN,d0         * get length of BSS in longwords
  221.         bra.s   clr_lp              * and clear for length given
  222. clr_bss move.l  d1,(a3)+
  223. clr_lp  dbf     d0,clr_bss
  224.  
  225. domain:
  226.     jsr    main(PC)        * Call main(argc,argv)
  227.         moveq.l #0,d0               * Set successful status
  228.         bra.s   exit2
  229.  
  230. exit:
  231. _exit:
  232. XCEXIT:
  233.         move.l  4(SP),d0        * Extract return code
  234. exit2:
  235.         move.l  d0,-(a7)
  236.         move.l  AbsExecBase.W,a6
  237.         move.l  DOSBase(A4),a1
  238.         callsys CloseLibrary            * Close Dos library
  239.  
  240. *------ this rts sends us back to DOS:
  241. exitToDOS:
  242.         MOVE.L  (A7)+,D0
  243.         movea.l _StackPtr(a4),SP        * Restore stack ptr
  244.         movem.l (a7)+,d1-d6/a0-a6
  245.         rts
  246.  
  247. *-----------------------------------------------------------------------
  248. * Global definitions
  249. *
  250.         csect   __MERGED,1,,2,2
  251. *
  252.         xdef    NULL,SysBase,LoadAddress,DOSBase
  253.         xdef    _oserr,_OSERR,_ONBREAK
  254.         xdef    _ProgramName,_StackPtr,_base
  255. *
  256. NULL           dc.l    0
  257. _base          dc.l    0
  258. _oserr         equ     *
  259. _OSERR         dc.l    0
  260. _ONBREAK       dc.l    0
  261. SysBase        dc.l    0
  262. LoadAddress    dc.l    0
  263. _StackPtr      dc.l    0
  264. DOSBase        dc.l    0
  265. _ProgramName   dc.l    0
  266. DOSName        dc.b    'dos.library',0
  267.  
  268.         END
  269.